Research Question

How to best tell if a video is click-bait or not?

Overview

We chose this topic because we like watching YouTube videos. A big issue with finding a Youtube you enjoy is avoiding clickbait videos. When you click on one, you waste time realizing its a clickbait video and then have to search for what you want again. There are many features of a video you can look at to tell that it is a clickbait video without having to watch part of the video. In this analysis, we will identify these features.

library(dplyr)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(ggplot2)
library(stringr)
library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
<U+2713> tibble  2.1.3     <U+2713> readr   1.3.1
<U+2713> tidyr   1.0.0     <U+2713> purrr   0.3.2
<U+2713> tibble  2.1.3     <U+2713> forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(stringi)
library(qdap)
Loading required package: qdapDictionaries
Loading required package: qdapRegex

Attaching package: 㤼㸱qdapRegex㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    %+%

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    explain

Loading required package: qdapTools
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: 㤼㸱qdapTools㤼㸲

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    id

Loading required package: RColorBrewer
Registered S3 methods overwritten by 'qdap':
  method               from
  t.DocumentTermMatrix tm  
  t.TermDocumentMatrix tm  

Attaching package: 㤼㸱qdap㤼㸲

The following object is masked from 㤼㸱package:forcats㤼㸲:

    %>%

The following object is masked from 㤼㸱package:purrr㤼㸲:

    %>%

The following object is masked from 㤼㸱package:tidyr㤼㸲:

    %>%

The following object is masked from 㤼㸱package:stringr㤼㸲:

    %>%

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    %>%

The following object is masked from 㤼㸱package:base㤼㸲:

    Filter
library(SentimentAnalysis)

Attaching package: 㤼㸱SentimentAnalysis㤼㸲

The following object is masked from 㤼㸱package:base㤼㸲:

    write

Imports and starting analysis

Here we load and get our data ready for analysis. The first dataset is from scraping YouTube videos and taking all features off it. We took title, likes, dislikes, views, description, comments, comment count, and if its a clickbait video or not. The second data set is a kaggle data set with many more titles so we can analyize the specific titles of videos better. The reasoning behind wanting more titles is because that is the easiest feature to look at to tell if a video is clickbait so we wanted to look at that further.

ClickbaitData <- read.csv("dataset.csv") #import 1
ClickbaitData2 <- read.csv("clickBait_Data.csv") #import 2
ClickbaitData2 <- ClickbaitData2 %>%
  mutate(clickbait = recode(clickbait, `0` = "False", `1` = "True")) %>%
  rename(class = clickbait) %>%
  rename(title = titles)
JoinedData <- merge(x = ClickbaitData, y = ClickbaitData2, by = "title", all = TRUE)
JoinedData %>%
  head()

Analysis 2: Trying spreading the data by classes.


SpreadTest <- ClickbaitData %>% 
  spread(key=class, value=dislikeCount)
head(SpreadTest)

# unstack narrow to wide

We start to see that dislikeCount has some kind of impact when we observed that there are higher number of dislikes on clickbait videos.

Analysis 3: Exploring the dataset by filtering the classes

Here we are analyzing the data more and looking into what videos are clickbait and not.

# analyzing data
IsClickbait <- ClickbaitData %>%
  filter(class != "False")
NotClickbait <- ClickbaitData %>%
  filter(class == "False")
head(NotClickbait)

Analysys 4: Number of capital letters

We see if the number of capital tletters in titles show any significance as a factor or not.

LenCaps <- ClickbaitData %>%
  mutate(capsLen = stri_count_regex(title, "[A-Z]"))
LenCaps %>%
  ggplot(aes(x = class, y = capsLen)) + geom_bar(stat = "identity")

We see there’s a strong correlation between the average number of uppercase letters in a clickbait video to a video that is not clickbait.

Analysis 5: Analysing dislikeCount as a factor

Here we see if a video has more dislikes, it is going to have a much higher chance to be a clickbait video.

LenData %>%
  head(2000) %>%
  group_by(class) %>%
  summarise(dislikeCount = mean(dislikeCount))%>%
  ggplot(aes(x = class, y = dislikeCount)) + geom_bar(stat = "identity")

The above graph made a lot of sense. We do not like clickbait videos so many people would dislike it. Now on clickbate videos, uploaders can give it fake likes so next we wanted to see if there was a relationship to the ratio of likes to dislikes. We see that no matter the likes, there will still be a high amount of dislikes telling us that a video is clickbait. ### Analysis 6: Analysing the ratio of dislikes to likes as a factor Now, we check for the LikeCounts vs DislikeCounts and analyze if their ratio is making a difference.

LenData %>%
  head(1000) %>%
  ggplot(aes(x = likeCount, y = dislikeCount, color = class)) + geom_point()

It looks like a video being a clickbait has a higher dislike to likes ratio and also has many outliers.

Analysis 7: Sentimental Analysis

Up next for analysis is sentimental analysis. Using the Qdap’s library function to get polarities of a string, we see if clickbait titles have more polarities - meaning being more positive, happy, which would attract people to click on these videos.

PolData<- LenData %>%
  mutate(polarity_title = counts(polarity(title))[, "polarity"])

  Some rows contain double punctuation.  Suggested use of `sentSplit` function.
PolData%>%
  group_by(class)%>%
  summarise(meanPol = mean(polarity_title))%>%
  ggplot(aes(x = class, y = meanPol)) + geom_bar(stat = "identity")

We see there’s a huge difference in polarities and a clickbait video is more likely to have higher levels of polarities. ### Decision Tree Since we found that polarities and the ratio of likes to dislikes are the strongest factors in deciding whether a video is clickbait or not, we decided to see what a decision tree would look like considering both of these factors.

#Decision Tree
PolData<- PolData%>%
  mutate(class = recode(class, `True` = 1, `False` = 0))

mod1 <- party::ctree(
  class ~ polarity_title + likeCount/dislikeCount,
  data=PolData) 
plot(mod1, type="simple")

Conclusion

To conclude, we had a huge dataset and a lot of features that could help us analyse if a video is clickbait or not. Our key visualizations and analysis found that a title’s polarity, dislikeCount to like Count ratio are 2 of the main factors which can help us know if a video is clickbait or not. We could use this analysis further to create Machine Learning algorithms which can tlell if a video is clickbait or not in real time.

LS0tDQp0aXRsZTogIkNsaWNrYmFpdC1hbmFseXNpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgUmVzZWFyY2ggUXVlc3Rpb24NCkhvdyB0byBiZXN0IHRlbGwgaWYgYSB2aWRlbyBpcyBjbGljay1iYWl0IG9yIG5vdD8NCg0KIyMgT3ZlcnZpZXcNCldlIGNob3NlIHRoaXMgdG9waWMgYmVjYXVzZSB3ZSBsaWtlIHdhdGNoaW5nIFlvdVR1YmUgdmlkZW9zLiBBIGJpZyBpc3N1ZSB3aXRoIGZpbmRpbmcgYSBZb3V0dWJlIHlvdSBlbmpveSBpcyBhdm9pZGluZyBjbGlja2JhaXQgdmlkZW9zLiBXaGVuIHlvdSBjbGljayBvbiBvbmUsIHlvdSB3YXN0ZSB0aW1lIHJlYWxpemluZyBpdHMgYSBjbGlja2JhaXQgdmlkZW8gYW5kIHRoZW4gaGF2ZSB0byBzZWFyY2ggZm9yIHdoYXQgeW91IHdhbnQgYWdhaW4uIFRoZXJlIGFyZSBtYW55IGZlYXR1cmVzIG9mIGEgdmlkZW8geW91IGNhbiBsb29rIGF0IHRvIHRlbGwgdGhhdCBpdCBpcyBhIGNsaWNrYmFpdCB2aWRlbyB3aXRob3V0IGhhdmluZyB0byB3YXRjaCBwYXJ0IG9mIHRoZSB2aWRlby4gSW4gdGhpcyBhbmFseXNpcywgd2Ugd2lsbCBpZGVudGlmeSB0aGVzZSBmZWF0dXJlcy4gIA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHN0cmluZ2kpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocWRhcCkNCmxpYnJhcnkoU2VudGltZW50QW5hbHlzaXMpDQpgYGANCiMjIyBJbXBvcnRzIGFuZCBzdGFydGluZyBhbmFseXNpcw0KDQpIZXJlIHdlIGxvYWQgYW5kIGdldCBvdXIgZGF0YSByZWFkeSBmb3IgYW5hbHlzaXMuIFRoZSBmaXJzdCBkYXRhc2V0IGlzIGZyb20gc2NyYXBpbmcgWW91VHViZSB2aWRlb3MgYW5kIHRha2luZyBhbGwgZmVhdHVyZXMgb2ZmIGl0LiBXZSB0b29rIHRpdGxlLCBsaWtlcywgZGlzbGlrZXMsIHZpZXdzLCBkZXNjcmlwdGlvbiwgY29tbWVudHMsIGNvbW1lbnQgY291bnQsIGFuZCBpZiBpdHMgYSBjbGlja2JhaXQgdmlkZW8gb3Igbm90LiBUaGUgc2Vjb25kIGRhdGEgc2V0IGlzIGEga2FnZ2xlIGRhdGEgc2V0IHdpdGggbWFueSBtb3JlIHRpdGxlcyBzbyB3ZSBjYW4gYW5hbHlpemUgdGhlIHNwZWNpZmljIHRpdGxlcyBvZiB2aWRlb3MgYmV0dGVyLiBUaGUgcmVhc29uaW5nIGJlaGluZCB3YW50aW5nIG1vcmUgdGl0bGVzIGlzIGJlY2F1c2UgdGhhdCBpcyB0aGUgZWFzaWVzdCBmZWF0dXJlIHRvIGxvb2sgYXQgdG8gdGVsbCBpZiBhIHZpZGVvIGlzIGNsaWNrYmFpdCBzbyB3ZSB3YW50ZWQgdG8gbG9vayBhdCB0aGF0IGZ1cnRoZXIuIA0KYGBge3J9DQpDbGlja2JhaXREYXRhIDwtIHJlYWQuY3N2KCJkYXRhc2V0LmNzdiIpICNpbXBvcnQgMQ0KQ2xpY2tiYWl0RGF0YTIgPC0gcmVhZC5jc3YoImNsaWNrQmFpdF9EYXRhLmNzdiIpICNpbXBvcnQgMg0KQ2xpY2tiYWl0RGF0YTIgPC0gQ2xpY2tiYWl0RGF0YTIgJT4lDQogIG11dGF0ZShjbGlja2JhaXQgPSByZWNvZGUoY2xpY2tiYWl0LCBgMGAgPSAiRmFsc2UiLCBgMWAgPSAiVHJ1ZSIpKSAlPiUNCiAgcmVuYW1lKGNsYXNzID0gY2xpY2tiYWl0KSAlPiUNCiAgcmVuYW1lKHRpdGxlID0gdGl0bGVzKQ0KSm9pbmVkRGF0YSA8LSBtZXJnZSh4ID0gQ2xpY2tiYWl0RGF0YSwgeSA9IENsaWNrYmFpdERhdGEyLCBieSA9ICJ0aXRsZSIsIGFsbCA9IFRSVUUpDQpKb2luZWREYXRhICU+JQ0KICBoZWFkKCkNCmBgYA0KIyMjIEFuYWx5c2lzIDI6IFRyeWluZyBzcHJlYWRpbmcgdGhlIGRhdGEgYnkgY2xhc3Nlcy4gDQoNCmBgYHtyfQ0KDQpTcHJlYWRUZXN0IDwtIENsaWNrYmFpdERhdGEgJT4lIA0KICBzcHJlYWQoa2V5PWNsYXNzLCB2YWx1ZT1kaXNsaWtlQ291bnQpDQpoZWFkKFNwcmVhZFRlc3QpDQoNCiMgdW5zdGFjayBuYXJyb3cgdG8gd2lkZQ0KYGBgDQpXZSBzdGFydCB0byBzZWUgdGhhdCBkaXNsaWtlQ291bnQgaGFzIHNvbWUga2luZCBvZiBpbXBhY3Qgd2hlbiB3ZSBvYnNlcnZlZCB0aGF0IHRoZXJlIGFyZSBoaWdoZXIgbnVtYmVyIG9mIGRpc2xpa2VzIG9uIGNsaWNrYmFpdCB2aWRlb3MuIA0KDQojIyMgQW5hbHlzaXMgMzogRXhwbG9yaW5nIHRoZSBkYXRhc2V0IGJ5IGZpbHRlcmluZyB0aGUgY2xhc3Nlcw0KSGVyZSB3ZSBhcmUgYW5hbHl6aW5nIHRoZSBkYXRhIG1vcmUgYW5kIGxvb2tpbmcgaW50byB3aGF0IHZpZGVvcyBhcmUgY2xpY2tiYWl0IGFuZCBub3QuIA0KYGBge3J9DQojIGFuYWx5emluZyBkYXRhDQpJc0NsaWNrYmFpdCA8LSBDbGlja2JhaXREYXRhICU+JQ0KICBmaWx0ZXIoY2xhc3MgIT0gIkZhbHNlIikNCk5vdENsaWNrYmFpdCA8LSBDbGlja2JhaXREYXRhICU+JQ0KICBmaWx0ZXIoY2xhc3MgPT0gIkZhbHNlIikNCmhlYWQoTm90Q2xpY2tiYWl0KQ0KYGBgDQojIyMgQW5hbHlzeXMgNDogTnVtYmVyIG9mIGNhcGl0YWwgbGV0dGVycw0KV2Ugc2VlIGlmIHRoZSBudW1iZXIgb2YgY2FwaXRhbCB0bGV0dGVycyBpbiB0aXRsZXMgc2hvdyBhbnkgc2lnbmlmaWNhbmNlIGFzIGEgZmFjdG9yIG9yIG5vdC4gDQpgYGB7cn0NCkxlbkNhcHMgPC0gQ2xpY2tiYWl0RGF0YSAlPiUNCiAgbXV0YXRlKGNhcHNMZW4gPSBzdHJpX2NvdW50X3JlZ2V4KHRpdGxlLCAiW0EtWl0iKSkNCkxlbkNhcHMgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXNzLCB5ID0gY2Fwc0xlbikpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpDQoNCmBgYA0KV2Ugc2VlIHRoZXJlJ3MgYSBzdHJvbmcgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnMgaW4gYSBjbGlja2JhaXQgdmlkZW8gdG8gYSB2aWRlbyB0aGF0IGlzIG5vdCBjbGlja2JhaXQuIA0KDQojIyMgQW5hbHlzaXMgNDogQW5hbHlzaW5nIGhvdyBsZW5ndGggb2YgdGl0bGVzIGFyZSByZWxhdGVkIHRvIGNsYXNzDQpMb29raW5nIGF0IHRoZSBwbG90IGJlbG93LCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgaXMgYSBub3JtYWwgcmFuZ2Ugb2YgdGl0bGUgbGVuZ3RocyBmcm9tIDEwLTEwMCBjaGFyYWN0ZXJzIGFuZCB0aGVuIGlmIGEgdmlkZW8gaXMgY2xpY2tiYWl0LCBpdCBjYW4gYmUgbGVzcyB0aGF0IHRoZSAxMCBjaGFyYWN0ZXIgYXZlcmFnZS4gDQoNCmBgYHtyfQ0KIA0KTGVuRGF0YSA8LSBDbGlja2JhaXREYXRhICU+JQ0KICBtdXRhdGUodGl0bGVMZW4gPSBzdHJpX2xlbmd0aCh0aXRsZSkpDQpMZW5EYXRhIDwtIENsaWNrYmFpdERhdGEgJT4lDQogIG11dGF0ZSh0aXRsZUxlbiA9IHN0cmlfbGVuZ3RoKHRpdGxlKSkNCkxlbkRhdGEgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXNzLCB5ID0gdGl0bGVMZW4pKSArIGdlb21fcG9pbnQoKQ0KDQoNCmBgYA0KDQojIyMgQW5hbHlzaXMgNTogQW5hbHlzaW5nIGRpc2xpa2VDb3VudCBhcyBhIGZhY3Rvcg0KSGVyZSB3ZSBzZWUgaWYgYSB2aWRlbyBoYXMgbW9yZSBkaXNsaWtlcywgaXQgaXMgZ29pbmcgdG8gaGF2ZSBhIG11Y2ggaGlnaGVyIGNoYW5jZSB0byBiZSBhIGNsaWNrYmFpdCB2aWRlby4gDQpgYGB7cn0NCkxlbkRhdGEgJT4lDQogIGhlYWQoMjAwMCkgJT4lDQogIGdyb3VwX2J5KGNsYXNzKSAlPiUNCiAgc3VtbWFyaXNlKGRpc2xpa2VDb3VudCA9IG1lYW4oZGlzbGlrZUNvdW50KSklPiUNCiAgZ2dwbG90KGFlcyh4ID0gY2xhc3MsIHkgPSBkaXNsaWtlQ291bnQpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKQ0KYGBgDQpUaGUgYWJvdmUgZ3JhcGggbWFkZSBhIGxvdCBvZiBzZW5zZS4gV2UgZG8gbm90IGxpa2UgY2xpY2tiYWl0IHZpZGVvcyBzbyBtYW55IHBlb3BsZSB3b3VsZCBkaXNsaWtlIGl0LiBOb3cgb24gY2xpY2tiYXRlIHZpZGVvcywgdXBsb2FkZXJzIGNhbiBnaXZlIGl0IGZha2UgbGlrZXMgc28gbmV4dCB3ZSB3YW50ZWQgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIHJlbGF0aW9uc2hpcCB0byB0aGUgcmF0aW8gb2YgbGlrZXMgdG8gZGlzbGlrZXMuIFdlIHNlZSB0aGF0IG5vIG1hdHRlciB0aGUgbGlrZXMsIHRoZXJlIHdpbGwgc3RpbGwgYmUgYSBoaWdoIGFtb3VudCBvZiBkaXNsaWtlcyB0ZWxsaW5nIHVzIHRoYXQgYSB2aWRlbyBpcyBjbGlja2JhaXQuIA0KIyMjIEFuYWx5c2lzIDY6IEFuYWx5c2luZyB0aGUgcmF0aW8gb2YgZGlzbGlrZXMgdG8gbGlrZXMgYXMgYSBmYWN0b3INCk5vdywgd2UgY2hlY2sgZm9yIHRoZSBMaWtlQ291bnRzIHZzIERpc2xpa2VDb3VudHMgYW5kIGFuYWx5emUgaWYgdGhlaXIgcmF0aW8gaXMgbWFraW5nIGEgZGlmZmVyZW5jZS4gDQpgYGB7cn0NCkxlbkRhdGEgJT4lDQogIGhlYWQoMTAwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IGxpa2VDb3VudCwgeSA9IGRpc2xpa2VDb3VudCwgY29sb3IgPSBjbGFzcykpICsgZ2VvbV9wb2ludCgpDQpgYGANCkl0IGxvb2tzIGxpa2UgYSB2aWRlbyBiZWluZyBhIGNsaWNrYmFpdCBoYXMgYSBoaWdoZXIgZGlzbGlrZSB0byBsaWtlcyByYXRpbyBhbmQgYWxzbyBoYXMgbWFueSBvdXRsaWVycy4gDQoNCg0KIyMjIEFuYWx5c2lzIDc6IFNlbnRpbWVudGFsIEFuYWx5c2lzDQpVcCBuZXh0IGZvciBhbmFseXNpcyBpcyBzZW50aW1lbnRhbCBhbmFseXNpcy4gVXNpbmcgdGhlIFFkYXAncyBsaWJyYXJ5IGZ1bmN0aW9uIHRvIGdldCBwb2xhcml0aWVzIG9mIGEgc3RyaW5nLCB3ZSBzZWUgaWYgY2xpY2tiYWl0IHRpdGxlcyBoYXZlIG1vcmUgcG9sYXJpdGllcyAtIG1lYW5pbmcgYmVpbmcgbW9yZSBwb3NpdGl2ZSwgaGFwcHksIHdoaWNoIHdvdWxkIGF0dHJhY3QgcGVvcGxlIHRvIGNsaWNrIG9uIHRoZXNlIHZpZGVvcy4gDQpgYGB7cn0NClBvbERhdGE8LSBMZW5EYXRhICU+JQ0KICBtdXRhdGUocG9sYXJpdHlfdGl0bGUgPSBjb3VudHMocG9sYXJpdHkodGl0bGUpKVssICJwb2xhcml0eSJdKQ0KUG9sRGF0YSU+JQ0KICBncm91cF9ieShjbGFzcyklPiUNCiAgc3VtbWFyaXNlKG1lYW5Qb2wgPSBtZWFuKHBvbGFyaXR5X3RpdGxlKSklPiUNCiAgZ2dwbG90KGFlcyh4ID0gY2xhc3MsIHkgPSBtZWFuUG9sKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikNCg0KYGBgDQpXZSBzZWUgdGhlcmUncyBhIGh1Z2UgZGlmZmVyZW5jZSBpbiBwb2xhcml0aWVzIGFuZCBhIGNsaWNrYmFpdCB2aWRlbyBpcyBtb3JlIGxpa2VseSB0byBoYXZlIGhpZ2hlciBsZXZlbHMgb2YgcG9sYXJpdGllcy4gDQojIyMgRGVjaXNpb24gVHJlZQ0KU2luY2Ugd2UgZm91bmQgdGhhdCBwb2xhcml0aWVzIGFuZCB0aGUgcmF0aW8gb2YgbGlrZXMgdG8gZGlzbGlrZXMgYXJlIHRoZSBzdHJvbmdlc3QgZmFjdG9ycyBpbiBkZWNpZGluZyB3aGV0aGVyIGEgdmlkZW8gaXMgY2xpY2tiYWl0IG9yIG5vdCwgd2UgZGVjaWRlZCB0byBzZWUgd2hhdCBhIGRlY2lzaW9uIHRyZWUgd291bGQgbG9vayBsaWtlIGNvbnNpZGVyaW5nIGJvdGggb2YgdGhlc2UgZmFjdG9ycy4gDQpgYGB7cn0NCiNEZWNpc2lvbiBUcmVlDQpQb2xEYXRhPC0gUG9sRGF0YSU+JQ0KICBtdXRhdGUoY2xhc3MgPSByZWNvZGUoY2xhc3MsIGBUcnVlYCA9IDEsIGBGYWxzZWAgPSAwKSkNCg0KbW9kMSA8LSBwYXJ0eTo6Y3RyZWUoDQogIGNsYXNzIH4gcG9sYXJpdHlfdGl0bGUgKyBsaWtlQ291bnQvZGlzbGlrZUNvdW50LA0KICBkYXRhPVBvbERhdGEpIA0KcGxvdChtb2QxLCB0eXBlPSJzaW1wbGUiKQ0KYGBgDQoNCiMjIyBDb25jbHVzaW9uDQpUbyBjb25jbHVkZSwgd2UgaGFkIGEgaHVnZSBkYXRhc2V0IGFuZCBhIGxvdCBvZiBmZWF0dXJlcyB0aGF0IGNvdWxkIGhlbHAgdXMgYW5hbHlzZSBpZiBhIHZpZGVvIGlzIGNsaWNrYmFpdCBvciBub3QuIE91ciBrZXkgdmlzdWFsaXphdGlvbnMgYW5kIGFuYWx5c2lzIGZvdW5kIHRoYXQgYSB0aXRsZSdzIHBvbGFyaXR5LCBkaXNsaWtlQ291bnQgdG8gbGlrZSBDb3VudCByYXRpbyBhcmUgMiBvZiB0aGUgbWFpbiBmYWN0b3JzIHdoaWNoIGNhbiBoZWxwIHVzIGtub3cgaWYgYSB2aWRlbyBpcyBjbGlja2JhaXQgb3Igbm90LiBXZSBjb3VsZCB1c2UgdGhpcyBhbmFseXNpcyBmdXJ0aGVyIHRvIGNyZWF0ZSBNYWNoaW5lIExlYXJuaW5nIGFsZ29yaXRobXMgd2hpY2ggY2FuIHRsZWxsIGlmIGEgdmlkZW8gaXMgY2xpY2tiYWl0IG9yIG5vdCBpbiByZWFsIHRpbWUuIA0K